(function($) {
    //设置联动开关
    var linkage = true;
	//扩展jQuery的插件
	$.fn.extend({
		"jqSearchBar": function(obj, callback) {
			//定义一个J变量，使layui中的时间空间根据数据动态显示多个
			var j = 0;
			//初始化bootstrap multiselect并设置宽度，默认没有选中的文字
			$(document).ready(function() {
				//设置下拉菜单的一些属性
				$('.btn-group').css({
					"margin": "10px",
					"float": "left"
				});
				//设置下拉菜单的内容区域的宽度
				$('.dropdown-menu').css('width', '200px');
				//layui时间插件的调用
				lay('#version').html('-v' + laydate.v);
				laydate.render({
					elem: '#contracttime' + j + '',
					type: 'date',
					range: true
				})
			});
			//定义that使this指向不发生改变，此时指向使用此插件的元素本身
			var that = $(this);
			//设置使用的元素的大小，默认为宽度200，高度150
			that.css({
				"width": "" + obj.width + "",
				"height": "" + obj.height + ""
			})
			//定义变量objModel接受数据，此变量接受的是设置的值，也就是要显示的东西
			var objModel = obj.colModel;
			//设置接受所属小类的url值
			function judge() {
				var smallUrl = '';
				for(var i = 0; i < objModel.length; i++) {
					if(objModel[i].name == "class_id") {
						return smallUrl = objModel[i].url;
					}
				}
			}
			//设置接受介绍人的url值
			function introducer() {
				var introducerUrl = '';
				for(var i = 0; i < objModel.length; i++) {
					if(objModel[i].name == "introducer_id") {
						return introducerUrl = objModel[i].url;
					}
				}
			}
			//获取所有的name,type,matchtype的属性
			function nameObj() {
				var nameObjArr = [];
				for(var i = 0; i < objModel.length; i++) {
					if(objModel[i].name != objModel[objModel.length - 1].name) {
						nameObjArr.push([objModel[i].name,objModel[i].matchtype,objModel[i].type,objModel[i].tablename,objModel[i].searchName]);
					}
				}
				return nameObjArr;
			}
			//获取查询按钮
			function btnObj() {
			    var btnArr = [];
			    for(var i = 0 ; i < objModel.length; i++){
			        if(objModel[i].name == objModel[objModel.length - 1].name){
			            btnArr.push(objModel[i].name);
			        }
			    }
			    return btnArr;
			}
			//循环遍历数据，取到其中的type的值进行判断然后添加对应的input或者select或者date
			objModel.map(function(val, index) {
				//根据传入type类型判断，如果是input类型，在使用元素后加input框
				if(val.type == "input") {
					that.append("<input class='form-control' type='text' name='" + val.name + "' id='" + val.name + "' style='width:" + val.width + "px;float:left;margin:10px;' placeholder='" + val.des + "' />");
				}
				var  selectdArr=[];
                var  historyArr=[];
				//根据传入type类型判断，如果是select类型，在使用元素后加select框
				if(val.type == "select") {
				    var isPost = true;
					//判断type类型是select的时候，首先动态创建select
					that.append("<select id='example-single" + val.name + "' class='form-control' multiple='multiple' style='height:100px;'></select>");
					$("#example-singleclass_pid").multiselect({
						enableFiltering: true,
						buttonWidth: val.width,
						maxHeight: 200,
						nonSelectedText: val.des,
						allSelectedText:"已选择全部"+val.des+"",
						nSelectedText:'项被选中',
						onDropdownShown : function() {//通过动态请求更改下拉列表的显示内容
						    if(isPost == true){
						        $.ajax({
                                    url: val.url,
                                    success: function(r) {
                                       var rData = r.response;
                                       if(r.code == 0){
                                            $.each(rData, function(index, objText) {
                                                $('#example-single' + val.name + '').append('<option value="' + objText.value + '">' + objText.text + '</option>');
                                            });
                                            var newRdata = new Array();
                                            var obj = new Object();
                                            $.each(rData, function(index, objText) {
                                                obj = {
                                                    label: objText.text,
                                                    title: objText.text,
                                                    value: objText.value,
                                                    id: objText.value
                                                };
                                                newRdata.push(obj);
                                            });
                                            $('#example-single' + val.name + '').multiselect('dataprovider', newRdata);
                                            $('#example-single' + val.name + '').multiselect('refresh');
                                            isPost = false;
                                       }else{
                                           isPost = true;
                                       }
                                    }
                                })
						    }
                        },
						onChange: function(option, checked) {
							//设置根据所属大类进行联动所属小类
							var selArr = [];
							$('#example-singleclass_pid option:selected').each(function() {
								selArr.push($(this).val());
								if(selArr.length == 1) {
									$.ajax({
										type: "get",
										url: judge() + "?class_pid=" + $(this).val(),
										success: function(data) {
											var twoData = data.response;
											$.each(twoData, function(index, objText) {
												$('#example-singleclass_id').append('<option value="' + objText.value + '">' + objText.text + '</option>');
											});
											var twoRdata = new Array();
                                            var obj = new Object();
                                            $.each(twoData, function(index, objText) {
                                                obj = {
                                                    label: objText.text,
                                                    title: objText.text,
                                                    value: objText.value,
                                                    id: objText.value
                                                };
                                                twoRdata.push(obj);
                                            });
                                            $('#example-singleclass_id').multiselect('dataprovider', twoRdata);
                                            $('#example-singleclass_id').multiselect('refresh');
                                             linkage=false;
										}
									})
								} else {
									$.ajax({
										url: judge(),
										success: function(r) {
											var rData = r.response;
											$.each(rData, function(index, objText) {
												$('#example-singleclass_id').append('<option value="' + objText.value + '">' + objText.text + '</option>');
											});
											var newRdata = new Array();
                                            var obj = new Object();
                                            $.each(rData, function(index, objText) {
                                                obj = {
                                                    label: objText.text,
                                                    title: objText.text,
                                                    value: objText.value,
                                                    id: objText.value
                                                };
                                                newRdata.push(obj);
                                            });
                                            $('#example-singleclass_id').multiselect('dataprovider', newRdata);
                                            $('#example-singleclass_id').multiselect('refresh');
										}
									})
								}
							});
						}
					});
					//设置根据供应商联动介绍人
//					$("#example-singlesupplier_id").multiselect({
//						enableFiltering: true,
//						buttonWidth: val.width,
//						maxHeight: 200,
//						nonSelectedText: val.des,
//						allSelectedText:"已选择全部"+val.des+"",
//						nSelectedText:'项被选中',
//						onDropdownShown : function() {//通过请求动态更改下拉列表的显示内容
//                            if(isPost == true){
//                                $.ajax({
//                                    url: val.url,
//                                    success: function(r) {
//                                       var rData = r.response;
//                                       if(r.code == 0){
//                                            $.each(rData, function(index, objText) {
//                                                $('#example-single' + val.name + '').append('<option value="' + objText.value + '">' + objText.text + '</option>');
//                                            });
//                                            var newRdata = new Array();
//                                            var obj = new Object();
//                                            $.each(rData, function(index, objText) {
//                                                obj = {
//                                                    label: objText.text,
//                                                    title: objText.text,
//                                                    value: objText.value,
//                                                    id: objText.value
//                                                };
//                                                newRdata.push(obj);
//                                            });
//                                            $('#example-single' + val.name + '').multiselect('dataprovider', newRdata);
//                                            $('#example-single' + val.name + '').multiselect('refresh');
//                                            isPost = false;
//                                       }else{
//                                           isPost = true;
//                                       }
//                                    }
//                                })
//                            }
//                        },
//						onChange: function(option, checked) {
//							//设置根据供应商进行联动介绍人
//							var supArr = [];
//							$('#example-singlesupplier_id option:selected').each(function() {
//								supArr.push($(this).val());
//								if(supArr.length == 1){
//									$.ajax({
//									type: "get",
//									url: introducer() + "?introducerId=" + $(this).val(),
//									success: function(data) {
//										var intData = data.response;
//										$.each(intData, function(index, objText) {
//											$('#example-singleintroducer_id').append('<option value="' + objText.value + '">' + objText.text + '</option>');
//										});
//										var intRdata = new Array();
//                                        var obj = new Object();
//                                        $.each(intData, function(index, objText) {
//                                            obj = {
//                                                label: objText.text,
//                                                title: objText.text,
//                                                value: objText.value,
//                                                id: objText.value
//                                            };
//                                            intRdata.push(obj);
//                                        });
//                                        $('#example-singleintroducer_id').multiselect('dataprovider', intRdata);
//                                        $('#example-singleintroducer_id').multiselect('refresh');
//									}
//								})
//								}else{
//									$.ajax({
//										url: introducer(),
//										success: function(r) {
//											var rData = r.response;
//											$.each(rData, function(index, objText) {
//												$('#example-singleintroducer_id').append('<option value="' + objText.value + '">' + objText.text + '</option>');
//											});
//											var intRdata = new Array();
//                                            var obj = new Object();
//                                            $.each(rData, function(index, objText) {
//                                                obj = {
//                                                    label: objText.text,
//                                                    title: objText.text,
//                                                    value: objText.value,
//                                                    id: objText.value
//                                                };
//                                                intRdata.push(obj);
//                                            });
//                                            $('#example-singleintroducer_id').multiselect('dataprovider', intRdata);
//                                            $('#example-singleintroducer_id').multiselect('refresh');
//										}
//									})
//								}
//							});
//						}
//					});
					//在判断完成之后，动态的重置bootstrap multiselect
					$('#example-single' + val.name + '').multiselect({
						enableFiltering: true,
						buttonWidth: val.width,
						maxHeight: 200,
						nonSelectedText: val.des,
						allSelectedText:"已选择全部"+val.des+"",
						nSelectedText:'项被选中',
						searchInput:function(event){
						    if(val.dataLess == false){
                                var name = event.target.value;
                                $.ajax({
                                    url: val.url + name,
                                    success: function(r) {
                                       var rData = r.response;
                                       if(r.code == 0){
                                            $('#example-single' + val.name + '').html("");
                                            $.each(rData, function(index, objText) {
                                                $('#example-single' + val.name + '').append('<option value="' + objText.value + '">' + objText.text + '</option>');
                                            });
                                            $('#example-single' + val.name + '').multiselect('rebuild');
                                       }
                                    }
                                })
                            }
						},
						onDropdownHidden:function(){

						    if(val.dataLess == false){
						        var num=0;
                             $('#example-single' + val.name).find('.history option:selected').map(function (index,item) {
                                   var indexNow=$(item).attr("index");
                                   historyArr.splice(parseInt(indexNow-num),1);
                                   num++;
                             });
                             var count=0;
                             $('#example-single' + val.name).find('option.recom:not(":selected")').map(function (index,item) {
                                  historyArr.push({"value":item.value,"text":item.text});
                                  var indexNow=$(item).attr("index");
                                  selectdArr.splice(parseInt(indexNow-count),1);
                                  count++;
                             });
                            var selectdStr = JSON.stringify(selectdArr);//转换成JSON字符串
                            $.cookie(obj.modelName+"_"+val.name+"_selectdStr",selectdStr,{ expires: 7});//存入cookie
                            var historyStr = JSON.stringify(historyArr);//转换成JSON字符串
                            $.cookie(obj.modelName+"_"+val.name+"_historyStr",historyStr,{ expires: 7});//存入cookie
						    }


						},
						onDropdownShown : function(event) {//通过请求动态更改下拉列表的显示内容
						if(val.dataLess == false){
                             var list='<optgroup class="recommend" label="推荐用户">';

                             var hislist='<optgroup class="history" label="常用用户">';
                            if($.cookie(obj.modelName+"_"+val.name+"_selectdStr")!=undefined){
                                selectdArr=JSON.parse($.cookie(obj.modelName+"_"+val.name+"_selectdStr"));
                            }
                            if($.cookie(obj.modelName+"_"+val.name+"_historyStr")!=undefined){
                               historyArr=JSON.parse($.cookie(obj.modelName+"_"+val.name+"_historyStr"));
                            }

                             $('#example-single' + val.name).find('option:not(".recom"):selected').map(function (index,item) {
                                  selectdArr.push({"value":item.value,"text":item.text});
                             });

                             $.each(selectdArr,function(i,item){

                         　　　　list+='<option class="recom" index="'+ i+'" selected value="' + item.value + '">' + item.text + '</option>';

                         　　});
                             $.each(historyArr,function(i,item){
                          　　　　hislist+='<option  index="'+ i+'" value="' + item.value + '">' + item.text + '</option>';
                          　　});

                             list+='</optgroup>';
                             hislist+='</optgroup>';
                             $('#example-single' + val.name).html("").append(list).append(hislist);

                             $('#example-single' + val.name + '').multiselect('rebuild');
                          }else{
                          if(linkage){
                            if(isPost == true){
                                $.ajax({
                                    url: val.url,
                                    success: function(r) {
                                       var rData = r.response;
                                       if(r.code == 0){
                                            $.each(rData, function(index, objText) {
                                                $('#example-single' + val.name + '').append('<option value="' + objText.value + '">' + objText.text + '</option>');
                                            });
                                            var newRdata = new Array();
                                            var obj = new Object();
                                            $.each(rData, function(index, objText) {
                                                obj = {
                                                    label: objText.text,
                                                    title: objText.text,
                                                    value: objText.value,
                                                    id: objText.value
                                                };
                                                newRdata.push(obj);
                                            });
                                            $('#example-single' + val.name + '').multiselect('dataprovider', newRdata);
                                            $('#example-single' + val.name + '').multiselect('refresh');
                                            isPost = false;
                                       }else{
                                           isPost = true;
                                       }
                                    }
                                })
                            }
                            }
                          }
                        }
					});
					//设置下拉菜单的一些属性
					$('.btn-group').css({
						"margin": "10px",
						"float": "left"
					});
				}
				//根据传入type类型判断，如果是date类型，在使用元素后加date框
				if(val.type == "date") {
					lay('#version').html('-v' + laydate.v);
					laydate.render({
						elem: '#contracttime' + val.name + '',
						type: 'date',
						range: true
					})
					//j++使j依次递增，实现动态id
					j++;
					that.append("<input class='form-control' id='contracttime" + val.name + "' type='text' style='width:" + val.width + "px;float:left;margin:10px;' placeholder='选择时间' />");
				}
				//动态添加查询按钮，返回后台数据
				if(val.type == "button") {
					that.append("<input class='btn btn-primary' id='" + val.name + "' type='button' value='" + val.des + "' style='width:" + val.width + "px;float:left;margin:10px;' />")
				}

			})

			if(callback) {
				$('#'+ btnObj()[0]).click(function() {
					var paramList = [];//设置存储的数组
					var objData = {};//回调返回的json对象
					var arr = [];//存储每次选择的值
					nameObj().map(function(v) {//nameObj()函数中带有name(v[0])，type(v2)，matchtype(v1)的值
						var  selected = $('#example-single' + v[0] + ' option:selected');//定义一个变量接受选中下拉的元素
						for(var i = 0 ; i < selected.length; i++){//循环获取每次选中的值，push到arr数组中
							arr.push(selected[i].value);
						}
                        if(v[2] == "select"){//判断当type类型等于select的时候这样进行push
//                            if(arr.length == 0){//判断下拉框是否选中，否则不传送数据
//                                return;
//                            }else{
//                                paramList.push({"name":v[0],"value":arr,"matchtype":v[1],"type":v[2],"tablename":v[3]})//把设置好的值进行对应的push
//                            }
                            paramList.push({"name":v[0],"value":arr,"matchtype":v[1],"type":v[2],"tablename":v[3]})//把设置好的值进行对应的push
                        }else if(v[2] == "date"){//否则判断type类型是不是date的，然后进行下面的push
                            var val = $('#contracttime'+v[0]+'').val();//设置每次获取到date的值
                            if(val == ""){//判断时间值是否为空，为空则不传送数据
                                return;
                            }else{
                                paramList.push({"name":v[0],"value":val,"matchtype":v[1],"type":v[2],"tablename":v[3]})//把设置好的值进行对应的push
                            }
                        }else if(v[2] == "input"){//否则判断type类型是不是input的，然后进行下面的push
                            var val = $('#'+v[0]+'').val();//设置每次获取到input的值
                            if(val == ""){//判断输入框值是否为空，为空则不传送数据
                                return;
                            }else{
                                paramList.push({"name":v[0],"value":val,"matchtype":v[1],"type":v[2],"tablename":v[3],"searchName":v[4]})//把设置好的值进行对应的push
                            }
                        }
                        objData.searchCon = paramList;//把数组赋值给对象下面的searchCon作为值
                        arr=[];//每次结束之后，清空上一次选择的值
					})
					callback(objData)
				})
			}
		}
	});
	//使用$.extend扩展添加到$.jqSearchBar这个扩展的方法中
	$.extend($.jqSearchBar, {
		modelName: "",
		colModel: [],
		height: 150,
		width: "auto",
		datatype: "xml"
	});
})(jQuery);

